﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaEstandarizarDuplicados
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PEstandarizarDuplicados : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CEstandarizarDuplicados.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.Entrada, value);
            }
        }

        /// <summary>
        /// Salida de datos.
        /// </summary>
        public string Salida
        {
            get
            {
                return this.getPropiedadString(CEstandarizarDuplicados.Salida);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.Salida, value);
            }
        }

        /// <summary>
        /// Estructura de entrada.
        /// </summary>
        public string EstructuraEntrada
        {
            get
            {
                return this.getPropiedadString(CEstandarizarDuplicados.EstructuraEntrada);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.EstructuraEntrada, value);
            }
        }

        /// <summary>
        /// Estructura de salida.
        /// </summary>
        public string EstructuraSalida
        {
            get
            {
                return this.getPropiedadString(CEstandarizarDuplicados.EstructuraSalida);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.EstructuraSalida, value);
            }
        }

        /// <summary>
        /// Lista campos que conforman la ventana de datos.
        /// </summary>
        public List<string> ListaCamposClave
        {
            get
            {
                return this.getPropiedadListaString(CEstandarizarDuplicados.CamposClave);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.CamposClave, value);
            }
        }

        /// <summary>
        /// Lista de funciones a emplear para realizar la estandarizacion.
        /// </summary>
        public List<string> ListaFuncionesEstandarizacion
        {
            get
            {
                return this.getPropiedadListaString(CEstandarizarDuplicados.FuncionesEstandarizacion);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.FuncionesEstandarizacion, value);
            }
        }

        /// <summary>
        /// Lista de parámetros de las funciones de estandarización.
        /// </summary>
        public List<string> ListaParametrosEstandarizacion
        {
            get
            {
                return this.getPropiedadListaString(CEstandarizarDuplicados.ParametrosFuncionesEstandarizacion);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.ParametrosFuncionesEstandarizacion, value);
            }
        }

        /// <summary>
        /// Lista campos sobre los que aplicar las funciones de estandarización.
        /// </summary>
        public List<string> ListaCamposFuncionesEstandarizacion
        {
            get
            {
                return this.getPropiedadListaString(CEstandarizarDuplicados.CamposProcesarFuncionesEstandarizacion);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.CamposProcesarFuncionesEstandarizacion, value);
            }
        }

        /// <summary>
        /// Lista de campos origen de la estandarización asociados a cada función.
        /// </summary>
        public List<List<string>> ListaCamposOrigenEstandarizacion
        {
            get
            {
                return this.getPropiedadListaListaString(CEstandarizarDuplicados.CamposOrigenEstandarizacion);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.CamposOrigenEstandarizacion, value);
            }
        }

        /// <summary>
        /// Lista de campos destino de la estandarización asociados a cada función.
        /// </summary>
        public List<List<string>> ListaCamposDestinoEstandarizacion
        {
            get
            {
                return this.getPropiedadListaListaString(CEstandarizarDuplicados.CamposDestinoEstandarizacion);
            }
            set
            {
                this.setOrAddPropiedad(CEstandarizarDuplicados.CamposDestinoEstandarizacion, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PEstandarizarDuplicados()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);

            this.Entrada = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaEntrada);
            this.Salida = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaSalida);
            this.EstructuraEntrada = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaEstructuraEntrada);
            this.EstructuraSalida = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaEstructuraSalida);

            // Campos clave
            int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CEstandarizarDuplicados.RutaClaves);
            for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
            {
                string campo = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaClaves, indiceCampo);
                if (!string.Empty.Equals(campo))
                    this.ListaCamposClave.Add(campo);
            }

            // Funciones estandarización    
            int numeroFunciones = LeerXml.ObtenerNumeroNodosCampo(xml, CEstandarizarDuplicados.RutaFunciones);
            for (int indiceFuncion = 0; indiceFuncion < numeroFunciones; indiceFuncion++)
            {
                // Función
                string funcion = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaFunciones, indiceFuncion, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionFuncion);
                if (!string.Empty.Equals(funcion) && new CListasFunciones().ListaFuncionesEstandarizacion.Contains(funcion))
                {
                    this.ListaFuncionesEstandarizacion.Add(funcion);
                    // Parámetros
                    try
                    {
                        string parametros = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaFunciones, indiceFuncion, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionParametros);
                        this.ListaParametrosEstandarizacion.Add(parametros);
                    }
                    catch (Exception)
                    {
                        this.ListaParametrosEstandarizacion.Add(string.Empty);
                    }

                    // Campo a procesar
                    string campoProcesar = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaFunciones, indiceFuncion, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionCampoFuncion);
                    this.ListaCamposFuncionesEstandarizacion.Add(campoProcesar);

                    // Campos origen y destino
                    List<string> camposOrigen = new List<string>();
                    List<string> camposDestino = new List<string>();
                    
                    int numeroCamposEstandarizar = LeerXml.ObtenerNumeroNodosCampo(xml, CEstandarizarDuplicados.RutaFunciones, indiceFuncion, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionCamposEstandarizar);
                    for (int indiceCampo = 0; indiceCampo < numeroCamposEstandarizar; indiceCampo++)
                    {
                        // Campo origen
                        string campoOrigen = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaFunciones, indiceFuncion, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionCamposEstandarizar, indiceCampo, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionCamposEstandarizarCamposCampoOrigen);

                        // Campo destino
                        string campoDestino = LeerXml.ObtenerValorCampo(xml, CEstandarizarDuplicados.RutaFunciones, indiceFuncion, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionCamposEstandarizar, indiceCampo, "./" + CEstandarizarDuplicados.NodoFuncionesFuncionCamposEstandarizarCamposCampoDestino);

                        if (!string.Empty.Equals(campoOrigen) || !string.Empty.Equals(campoDestino))
                        {
                            camposOrigen.Add(campoOrigen);
                            camposDestino.Add(campoDestino);
                        }
                    }
                    this.ListaCamposOrigenEstandarizacion.Add(camposOrigen);
                    this.ListaCamposDestinoEstandarizacion.Add(camposDestino);
                }
            }
        }
    }
}
